package com.fjh.springboot_01.mapper;

import com.fjh.springboot_01.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * UserMapper接口，用于处理与User实体相关的数据库操作。
 * 该接口使用MyBatis的注解进行SQL映射。
 */
@Mapper
public interface UserMapper {

    /**
     * 根据用户名查找用户。
     *
     * @param username 用户名
     * @return 返回与给定用户名匹配的User对象
     */
    @Select("select * from user where username=#{username}")
    User findByUserName(String username);

    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Integer id);

    /**
     * 根据用户ID查询用户名称
     */


    /**
     * 向数据库中添加一个新的用户。
     *
     * @param username 用户名
     * @param password 密码
     * @param email    用户邮箱
     */
    @Insert("INSERT INTO user(username, password, email, role, teacher_status, create_time, update_time) " +
            "VALUES(#{username}, #{password}, #{email}, #{role}, " +
            "CASE WHEN #{role} = 1 THEN 0 ELSE NULL END, NOW(), NOW())")
    void add(@Param("username") String username, 
             @Param("password") String password, 
             @Param("email") String email, 
             @Param("role") Integer role);

    /**
     * 更新用户的昵称和邮箱。
     *
     * @param user 包含更新后的昵称、邮箱和用户ID的User对象
     */
    @Update("update user set nickname=#{nickname}, email=#{email}, update_time=NOW() where id=#{id}")
    void update(User user);

    /**
     * 更新用户的头像。
     *
     * @param avatarUrl 新的头像URL
     * @param id        要更新头像的用户ID
     */
    @Update("update user set user_pic=#{avatarUrl}, update_time=NOW() where id=#{id}")
    void updateAvatar(String avatarUrl, Integer id);

    /**
     * 更新用户的密码。
     *
     * @param md5String 新的MD5格式密码
     * @param id        要更新密码的用户ID
     */
    @Update("update user set password=#{md5String}, update_time=NOW() where id=#{id}")
    void updatePwd(String md5String, Integer id);

    // 获取所有待审核的教师申请
    @Select("SELECT * FROM user WHERE role = 1 AND teacher_status = 0")
    List<User> getPendingTeachers();

    // 更新教师审核状态
    @Update("UPDATE user SET teacher_status = #{status}, update_time = NOW() WHERE id = #{id}")
    void updateTeacherStatus(@Param("id") Integer id, @Param("status") Integer status);

    // 获取所有用户
    @Select("SELECT * FROM user")
    List<User> getAllUsers();

    // 更新用户状态
    @Update("UPDATE user SET status = #{status}, update_time = NOW() WHERE id = #{id}")
    void updateUserStatus(@Param("id") Integer id, @Param("status") Integer status);

    // 删除用户
    @Update("DELETE FROM user WHERE id = #{id}")
    void deleteUser(Integer id);

    // 根据角色获取用户列表（包括全部用户）
    @Select({
        "<script>",
        "SELECT * FROM user",
        "<where>",
        "<if test='role != null'>",
        "role = #{role}",
        "</if>",
        "</where>",
        "</script>"
    })
    List<User> getUsersByRole(@Param("role") Integer role);
    
    // 获取热门教师（按评分排序）
    @Select("SELECT u.*, AVG(ts.rating) as avg_rating " +
            "FROM user u " +
            "LEFT JOIN tutoring_schedule ts ON u.id = ts.teacher_id " +
            "WHERE u.role = 1 AND u.teacher_status = 1 AND ts.rating IS NOT NULL " +
            "GROUP BY u.id " +
            "ORDER BY avg_rating DESC " +
            "LIMIT #{limit}")
    List<User> getPopularTeachers(int limit);
    
    // 获取平台教师数量
    @Select("SELECT COUNT(*) FROM user WHERE role = 1 AND teacher_status = 1")
    int getTeacherCount();
    
    // 获取平台学生数量
    @Select("SELECT COUNT(*) FROM user WHERE role = 0")
    int getStudentCount();
}
